package clam.apps.adu.activity;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.MediaColumns;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import clam.apps.adu.metier.Departement;
import clam.apps.adu.metier.Etablissement;
import clam.apps.adu.metier.Etat;
import clam.apps.adu.metier.Story;
import clam.apps.adu.metier.Theme;

public class PosterAnecdoteActivity extends Activity implements
		OnClickListener, OnItemSelectedListener
{
	
	private MenuLateral					menu;
	private EditText					et_login;
	private EditText					et_anecdote;
	private EditText					et_url;
	private ImageButton					ib_plus;
	private static final int			FILE_RESULT_CODE	= 101;
	private Spinner						s_theme;
	private Spinner						s_etablissement;
	private Spinner						s_departement;
	private TextView					tv_departement;
	private ArrayList<Etablissement>	al_etablissement;
	private boolean						chargement_termine	= false;
	Uri									URI					= null;
	int									columnIndex;
	
	private String						imagePath;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		
		// chargement du layout poster anecdote
		this.setContentView(R.layout.activity_poster_anecdote);
		
		// instancie le menu latéral
		this.menu = new MenuLateral(this);
		
		// rend l'icone de l'actionBar cliquable afin de faire apparaitre le
		// menu
		this.getActionBar().setDisplayHomeAsUpEnabled(true);
		
		if(checkConnect())
		{
			// récupère les instances des editTexte login et anecdote ainsi que du
			// bouton plus
			this.et_login = (EditText) this.findViewById(R.id.et_login);
			this.et_anecdote = (EditText) this.findViewById(R.id.et_anecdote);
			this.et_url = (EditText) this.findViewById(R.id.et_url);
			this.ib_plus = (ImageButton) this.findViewById(R.id.ib_plus);
			
			// recupère les instances des spinners
			this.s_theme = (Spinner) this.findViewById(R.id.s_theme);
			this.s_etablissement = (Spinner) this
					.findViewById(R.id.s_etablissement);
			this.s_departement = (Spinner) this.findViewById(R.id.s_departement);
			
			this.tv_departement = (TextView) this.findViewById(R.id.tv_departement);
			
			// alimente le spinner en theme
			ArrayList<Theme> al_theme = Theme.findAll();
			Iterator<Theme> i_theme = al_theme.iterator();
			String[] s_theme = new String[al_theme.size()];
			for (int i = 0, c = al_theme.size(); i < c; i++, i_theme.hasNext())
				s_theme[i] = i_theme.next().getLibelle();
			ArrayAdapter<String> aa_theme = new ArrayAdapter<String>(this,
					android.R.layout.simple_spinner_dropdown_item, s_theme);
			this.s_theme.setAdapter(aa_theme);
			
			// alimente le spinner en etablissement
			this.al_etablissement = Etablissement.findAll();
			Iterator<Etablissement> i_etablissement = this.al_etablissement
					.iterator();
			String[] s_etablissement = new String[this.al_etablissement.size()];
			for (int i = 0, c = this.al_etablissement.size(); i < c; i++, i_etablissement
					.hasNext())
				s_etablissement[i] = i_etablissement.next().getLibelle();
			ArrayAdapter<String> aa_etablissement = new ArrayAdapter<String>(this,
					android.R.layout.simple_spinner_dropdown_item, s_etablissement);
			this.s_etablissement.setAdapter(aa_etablissement);
			this.s_etablissement.setOnItemSelectedListener(this);
			
			// ajoute un écouteur sur les boutons plus et envoyer
			this.ib_plus.setOnClickListener(this);
			this.findViewById(R.id.b_envoyer).setOnClickListener(this);
		}
		else
		{
			Log.i("Connexion", "Connexion fail");
			this.findViewById(R.id.sv_scroll).setVisibility(View.INVISIBLE);
			Toast.makeText(this.getBaseContext(),
				this.getString(R.string.erreur_connexion), Toast.LENGTH_LONG)
				.show();
		}
	}
	
	@Override
	public void onClick(View v)
	{
		switch (v.getId())
		{
		// permet de choisir une image dans la gallerie du téléphone
			case R.id.ib_plus:
				this.openGallery();
				break;
			// permet d'envoyer l'anecdote
			case R.id.b_envoyer:
				this.envoyer();
				break;
		}
	}
	
	// envoie l'anecdote avec l'état "Non modérée"
	public void envoyer()
	{
		if (!this.et_anecdote.getText().equals(""))
		{
			// on crée une story et on l'alimente
			Story story = new Story();
			if (!this.et_login.getText().equals(""))
				story.setLogin(this.et_login.getText().toString());
			story.setTexte(this.et_anecdote.getText().toString());
			story.setTheme(Theme.findByLibelle(this.s_theme.getSelectedItem()
					.toString()));
			story.setEtablissement(Etablissement
					.findByLibelle(this.s_etablissement.getSelectedItem()
							.toString()));
			if (this.s_departement.getVisibility() == View.VISIBLE)
				story.setDepartement(Departement
						.findByLibelle(this.s_departement.getSelectedItem()
								.toString()));
			if (!this.et_url.getText().equals(""))
				story.setPhoto(this.et_url.getText().toString());
			Log.i("ee", this.et_url.getText().toString());
			
			story.setEtat(Etat.findByLibelle("Non modérée"));
			story.ajouter();
			
			// toast de confirmation
			Toast.makeText(this.getBaseContext(),
					this.getString(R.string.confirmation_poster),
					Toast.LENGTH_LONG).show();
			
			// lance l'application dernieresAnecdotes
			this.startActivity(new Intent(this,
					DernieresAnecdotesActivity.class));
			
			// termine l'activity en cours
			this.finish();
		}
		else
			Toast.makeText(this.getBaseContext(),
					this.getString(R.string.erreur_anecdote),
					Toast.LENGTH_SHORT).show();
	}
	
	// ouvre la gallerie afin de choisir une piece-jointe
	public void openGallery()
	{
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");
		intent.addCategory(Intent.CATEGORY_OPENABLE);
		Intent i = Intent.createChooser(intent, "Image");
		this.startActivityForResult(i, PosterAnecdoteActivity.FILE_RESULT_CODE);
	}
	
	// permet de recupérer la photo choisis dans la gallerie ouverte avec la
	// fonction openGallery ainsi que d'afficher la miniature de la photo à la
	// place du bouton
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		if ((requestCode == PosterAnecdoteActivity.FILE_RESULT_CODE)
				&& (resultCode == Activity.RESULT_OK))
		{
			// récupère le path du fichier choisit et insstancie le fichier
			Uri selectedImage = data.getData();
			@SuppressWarnings("deprecation")
			Cursor imgCursor = this.managedQuery(selectedImage, new String[] {
					MediaColumns.DATA,
					MediaStore.Images.ImageColumns.ORIENTATION
			}, null, null, null);
			imgCursor.moveToFirst();
			File f = new File(imgCursor.getString(0));
			this.imagePath = imgCursor.getString(0);
			
			// récupère l'image dans un drawable puis le cast en Bitmap afin de
			// le redimensionner
			Drawable image = Drawable.createFromPath(f.getAbsolutePath());
			Bitmap bitmap = ((BitmapDrawable) image).getBitmap();
			
			// redimensionne l'image suivant si elle est au format portrait ou
			// paysage
			if (bitmap.getWidth() > bitmap.getHeight())
				image = new BitmapDrawable(this.getResources(),
						Bitmap.createScaledBitmap(bitmap, 400, 300, true));
			else
				image = new BitmapDrawable(this.getResources(),
						Bitmap.createScaledBitmap(bitmap, 300, 400, true));
			
			// enleve le padding, rajoute l'image au bouton et le rend non
			// cliquable
			this.ib_plus.setPadding(0, 0, 0, 0);
			this.ib_plus.setImageDrawable(image);
			this.ib_plus.setEnabled(false);
		}
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		// permet de valider la selection du menu
		if (this.menu.getDrawerToggle().onOptionsItemSelected(item))
			return true;
		
		return super.onOptionsItemSelected(item);
	}
	
	@Override
	public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
			long arg3)
	{
		// permet de n'appeler ce code que lorsque le chargement est terminé, en
		// effet, onItemSelected est automatiquement appelé une 1ère fois dans
		// onCreate
		if (this.chargement_termine)
		{
			// récupère tous les département lié à l'établissement (s'il y en a)
			ArrayList<Departement> al_departement = Departement
					.findByEtablissement(this.al_etablissement.get(arg2));
			if (al_departement.size() > 0)
			{
				// alimente le spinner en departement
				this.tv_departement.setVisibility(View.VISIBLE);
				this.s_departement.setVisibility(View.VISIBLE);
				Iterator<Departement> i_departement = al_departement.iterator();
				String[] s_departement = new String[al_departement.size()];
				for (int i = 0, c = al_departement.size(); i < c; i++, i_departement
						.hasNext())
					s_departement[i] = i_departement.next().getLibelle();
				ArrayAdapter<String> aa_departement = new ArrayAdapter<String>(
						this, android.R.layout.simple_spinner_dropdown_item,
						s_departement);
				this.s_departement.setAdapter(aa_departement);
			}
			else
			{
				// si il n'y a pas de département, on cache le TextView et le
				// Spinner des départements
				this.tv_departement.setVisibility(View.INVISIBLE);
				this.s_departement.setVisibility(View.INVISIBLE);
			}
		}
		this.chargement_termine = true;
	}
	
	@Override
	public void onNothingSelected(AdapterView<?> arg0)
	{	
		
	}
	
	// test de la connexion
	public boolean checkConnect()
	{
		ConnectivityManager cm = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
		return (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected());
	}
	
}
